package com.example.a_java.common;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.io.Serializable;

/**
 * 通用返回结果类
 * 封装API接口统一的返回格式
 * @param <T> 返回的数据类型
 */
@Data
@Schema(description = "通用返回结果")
public class Result<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 返回代码
     */
    @Schema(description = "返回代码")
    private String code;

    /**
     * 返回消息
     */
    @Schema(description = "返回消息")
    private String msg;

    /**
     * 返回数据
     */
    @Schema(description = "返回数据")
    private T data;

    /**
     * 私有构造方法，禁止外部直接实例化
     */
    private Result() {
    }

    /**
     * 私有构造方法，设置返回数据
     * @param code 返回代码
     * @param msg 返回消息
     * @param data 返回数据
     */
    private Result(String code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 成功返回结果
     * @param <T> 返回数据类型
     * @return Result对象
     */
    public static <T> Result<T> success() {
        return new Result<>("200", "操作成功", null);
    }

    /**
     * 成功返回结果
     * @param data 返回数据
     * @param <T> 返回数据类型
     * @return Result对象
     */
    public static <T> Result<T> success(T data) {
        return new Result<>("200", "操作成功", data);
    }

    /**
     * 成功返回结果
     * @param msg 提示消息
     * @param data 返回数据
     * @param <T> 返回数据类型
     * @return Result对象
     */
    public static <T> Result<T> success(String msg, T data) {
        return new Result<>("200", msg, data);
    }

    /**
     * 失败返回结果
     * @param <T> 返回数据类型
     * @return Result对象
     */
    public static <T> Result<T> error() {
        return new Result<>("500", "操作失败", null);
    }

    /**
     * 失败返回结果
     * @param msg 提示消息
     * @param <T> 返回数据类型
     * @return Result对象
     */
    public static <T> Result<T> error(String msg) {
        return new Result<>("500", msg, null);
    }

    /**
     * 失败返回结果
     * @param code 错误码
     * @param msg 提示消息
     * @param <T> 返回数据类型
     * @return Result对象
     */
    public static <T> Result<T> error(String code, String msg) {
        return new Result<>(code, msg, null);
    }
    
    /**
     * 失败返回结果，与error方法功能相同，提供更直观的方法名
     * @param msg 提示消息
     * @param <T> 返回数据类型
     * @return Result对象
     */
    public static <T> Result<T> fail(String msg) {
        return new Result<>("500", msg, null);
    }

    /**
     * 参数验证失败返回结果
     * @param msg 提示消息
     * @param <T> 返回数据类型
     * @return Result对象
     */
    public static <T> Result<T> validateFailed(String msg) {
        return new Result<>("400", msg, null);
    }

    /**
     * 未登录返回结果
     * @param <T> 返回数据类型
     * @return Result对象
     */
    public static <T> Result<T> unauthorized() {
        return new Result<>("401", "暂未登录或token已经过期", null);
    }

    /**
     * 未授权返回结果
     * @param <T> 返回数据类型
     * @return Result对象
     */
    public static <T> Result<T> forbidden() {
        return new Result<>("403", "没有相关权限", null);
    }
} 
